home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 8: LINUX Games
/
Linux Cubed Series 8 - LINUX Games.iso
/
games
/
x11
/
strategy
/
xpat2-1.000
/
xpat2-1
/
xpat2-1.04
/
src
/
Xlib-events.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-22
|
4KB
|
135 lines
/*****************************************************************************/
/* */
/* */
/* X patience version 2 -- module Xlib-events.c */
/* */
/* Additional event handlers for the Xlib interface. */
/* written by Heiko Eissfeldt and Michael Bischoff */
/* see COPYRIGHT.xpat2 for Copyright details */
/* */
/* */
/*****************************************************************************/
#ifdef useXlib
#include "X-pat.h"
/* helper functions for Xlib interface */
/* dispatcher for event on table */
static void handle_table_event(XEvent *xev) {
switch(xev->xany.type) {
case ButtonPress: button_press(&xev->xbutton);
break;
case ButtonRelease:button_release(&xev->xbutton);
break;
case MotionNotify: mouse_motion(&xev->xmotion);
break;
case KeyPress: key_press(&xev->xkey);
break;
case Expose: redraw_table(&xev->xexpose);
break;
case ConfigureNotify:resize_event(
xev->xconfigure.width,
xev->xconfigure.height);
break;
}
}
void (*check_button_list(struct singlebutton *p, int num,
XButtonPressedEvent *xev))(void) {
while (num--) {
if (xev->x >= p->x && xev->x < p->x + p->w &&
xev->y >= p->y && xev->y < p->y + p->h) {
switch (xev->button) {
case Button1:
return p->left;
case Button2:
return p->middle;
case Button3:
return p->right;
}
}
++p;
}
return NULL;
}
/* events in confirm window */
static void conf_button_press(XButtonPressedEvent *xev) {
void (*func)(void);
func = check_button_list(confirmbuttons, 2, xev);
if (func)
(*func)();
}
static void redraw_confirm(XExposeEvent *xev) {
XFillRectangle(dpy, confirm.win, whitegc, 0, 0, confirm.w-1, confirm.h-1);
/* draw the text */
XDrawImageString(dpy, confirm.win, button.gc,
graphic.xgap, button.by+button.font->ascent, "Please confirm", 14);
XDrawImageString(dpy, confirm.win, button.gc, graphic.xgap,
2 * button.by+button.font->ascent + button.fontheight, confirm.text,
strlen(confirm.text));
redraw_buttons(0, 0, confirm.w, confirm.h, confirm.win, 2, confirmbuttons);
}
static void handle_confirm_event(XEvent *xev) {
switch(xev->xany.type) {
case ButtonPress:
conf_button_press(&xev->xbutton);
break;
case KeyPress:
key_press(&xev->xkey); /* go same window */
break;
}
}
static void redraw_finwin(XExposeEvent *xev) {
XFillRectangle(dpy, finished_win, whitegc, 0, 0,
FINISHED_W-1, FINISHED_H-1);
/* draw the text */
XDrawImageString(dpy, finished_win, button.gc,
(FINISHED_W - XTextWidth(button.font, "GONZO!", 6))/2,
FINISHED_H * 2 / 3, "GONZO!", 6);
XFlush(dpy);
}
void handle_expose_event(XExposeEvent *xev) {
if (xev->window == confirm.win)
redraw_confirm(xev);
else if (xev->window == finished_win)
redraw_finwin(xev);
}
void event_loop(void) {
XEvent xev;
cmd_CancelSelection();
while (1) {
#if 0
if (game.ind[FIRST_SLOT] == rules.cards_per_color * rules.numstacks
&& !game.finished) {
/* all cards on the stacks and not yet notified */
game.finished = True;
XMoveWindow(dpy, finished_win, (graphic.width - FINISHED_W) / 2,
(graphic.height - FINISHED_H) / 2);
XMapWindow(dpy, finished_win);
redraw_finwin((XExposeEvent *)0);
show_message("You did it!");
write_log_file();
do_music(&xev); /* play until next event */
XUnmapWindow(dpy, finished_win);
} else
#endif
XNextEvent(dpy, &xev);
if (xev.xany.window == table)
handle_table_event(&xev);
else if (xev.xany.type == Expose) /* expose events are treated separately */
handle_expose_event(&xev.xexpose);
else if (xev.xany.window == confirm.win)
handle_confirm_event(&xev);
}
}
#endif